package com.ww.juc.completable.future.then;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
 * thenApply和thenApplyAsync
 * thenApply表示某个任务执行完成后执行的动作，即回调方法，会将该任务的执行结果即方法返回值作为入参传递到回调方法中，带有返回值
 * 
 * 区别：
 * thenApply和thenApplyAsync区别在于，使用thenApply方法时子任务和父任务使用的是同一个线程，而thenApplyAsync在子任务中是另起一个线程执行任务，
 * 并且thenApplyAsync可以自定义线程池，默认使用的是ForkJoinPool.commonPool()线程池
 * 
 * @author wanggw
 * 2024年2月4日 下午5:11:58
 */
public class ThenApplyDemo {

	public static void main(String[] args) throws InterruptedException, ExecutionException {
		CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
			System.out.println(Thread.currentThread() + "任务执行中...");
			return Thread.currentThread() + "任务执行完成";
		});
		
		CompletableFuture<String> cf2 = cf1.thenApplyAsync((result) -> {
			System.out.println(Thread.currentThread() + "任务开始执行...");
			return result += "===>>>" + Thread.currentThread() + "任务也执行完毕了...";
		});
		
		System.out.println(cf1.get());
		System.out.println("-------------------");
		System.out.println(cf2.get());
		
		System.out.println("=========================================");
		
		CompletableFuture<String> cf3 = cf1.thenApply((result) -> {
			System.out.println(Thread.currentThread() + "任务也开始执行了...");
			return result += "*****" + Thread.currentThread() + "任务也执行完成了...";
		});
		
		System.out.println(cf3.get());
	}
}
